package singleton

import (
	"sync"
)

/*
LazyWay 懒汉方式
*/
type LazyWay struct{}

var lazyWay *LazyWay

/*
GetLazyWayDanger 懒汉危险方式
缺点：非线程安全。当正在创建时，有线程来访问此时ins = nil就会再创建，单例类就会有多个实例了。
*/
func GetLazyWayDanger() *LazyWay {
	if lazyWay == nil {
		lazyWay = new(LazyWay)
	}
	return lazyWay
}

var once sync.Once

/*
GetLazyWaySafety 懒汉安全方式 类似于双重检查模式 （DCL）
线程安全 保证实例化只有一次
*/
func GetLazyWaySafety() *LazyWay {
	once.Do(func() {
		lazyWay = new(LazyWay)
	})
	return lazyWay
}

/*
HungryWay 饿汉方式
线程安全 保证实例化只有一次
*/
type HungryWay struct{}

//方式1
var hungryWay = new(HungryWay)

//方式2
func init() {
	hungryWay = new(HungryWay)
}

func GetHungryWay() *HungryWay {
	return hungryWay
}
